package mybatis.transaction.managed;

import mybatis.session.TransactionIsolationLevel;
import mybatis.transaction.Transaction;
import mybatis.transaction.TransactionFactory;
import org.apache.commons.lang3.StringUtils;

import javax.sql.DataSource;
import java.sql.Connection;
import java.util.Properties;

/**
 * 事务管理器工厂类
 *
 * @author richie696
 * @version 1.0
 * @since 2020/11/08
 */
public class ManagedTransactionFactory implements TransactionFactory {

    private boolean closeConnection = true;

    /**
     * 设置是否关闭连接的方法
     *
     * @param props 配置数据
     */
    @Override
    public void setProperties(Properties props) {
        if (props != null) {
            String prop = props.getProperty("closeConnection");
            if (StringUtils.isBlank(prop)) {
                return;
            }
            closeConnection = Boolean.parseBoolean(prop);
        }
    }

    /**
     * 新建默认事务的方法
     *
     * @param connection 数据库连接
     * @return 返回事务对象
     */
    @Override
    public Transaction newTransaction(Connection connection) {
        return new ManagedTransaction(connection, closeConnection);
    }

    /**
     * 新建事务的方法
     *
     * @param dataSource 数据源对象
     * @param level      事务级别
     * @return 返回事务对象
     * @see TransactionIsolationLevel 事务级别定义枚举
     */
    @Override
    public Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit) {
        // 外部托管事务不做自动提交相关的操作，所以autoCommit参数不使用
        return new ManagedTransaction(dataSource, level, closeConnection);
    }
}
